#include "debug.h"
#include "../DDIC/AllDDIC.h"


extern void GenW_PANEL_normal_SPI_Write_code(u8 SPI_Mode,u8 channel ,u8 para[]);
extern u8 GenR_PANEL_SPI4_Read_u8_Data(u8 SPI_Mode,u8 channel,u8 reg,u8 para[],u8 back_num);

u8 SH8501A_Gamma_r[54]= {
    0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x0C,0x0D, 0x0E,0x0F, 0x10,0x11,
    0x12,0x13, 0x14,0x15, 0x16,0x17, 0x18,0x19, 0x1A,0x1B, 0x1C,0x1D, 0x1E,0x1F, 0x20,0x21, 0x22,0x23,
	  0x24,0x25, 0x26,0x27, 0x28,0x29, 0x2A,0x2B, 0x2D,0x2F, 0x30,0x31, 0x32,0x33, 0x34,0x35, 0x36,0x37, 
};
u8 SH8501A_Gamma_g[54]= {   
	  0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x46,0x47, 0x48,0x49, 0x4A,0x4B,
    0x4C,0x4D, 0x4E,0x4F, 0x50,0x52, 0x53,0x54, 0x55,0x56, 0x57,0x58, 0x59,0x5A, 0x5B,0x5C, 0x5D,0x5E,
    0x5F,0x60, 0x61,0x62, 0x63,0x64, 0x65,0x66, 0x67,0x68, 0x69,0x6A, 0x6B,0x6C, 0x6D,0x6E, 0x6F,0x70,		
};
u8 SH8501A_Gamma_b[54]={
	  0x71,0x72, 0x73,0x74, 0x75,0x76, 0x77,0x78, 0x79,0x7A, 0x7B,0x7C, 0x7D,0x7E, 0x7F,0x80, 0x81,0x82,
	  0x83,0x84, 0x85,0x86, 0x87,0x88, 0x89,0x8A, 0x8B,0x8C, 0x8D,0x8E, 0x8F,0x90, 0x91,0x92, 0x93,0x94,
	  0x95,0x96, 0x97,0x98, 0x99,0x9A, 0x9B,0x9C, 0x9D,0x9E, 0x9F,0xA0, 0xA2,0xA3, 0xA4,0xA5, 0xA6,0xA7,
};

u8 SH8501A_Gamma_r1[26]= {
		0x00,0x01, 0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x12,0x13, 0x1C,0x1D, 0x20,0x21,
		0x24,0x25, 0x28,0x29, 0x2D,0x2F, 0x36,0x37,  
};
u8 SH8501A_Gamma_g1[26]= {   
		0x38,0x39, 0x3A,0x3B, 0x3D,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x4C,0x4D, 0x57,0x58, 0x5B,0x5C,
		0x5F,0x60, 0x63,0x64, 0x67,0x68, 0x6F,0x70,		
};
u8 SH8501A_Gamma_b1[26]={
		0x71,0x72, 0x73,0x74, 0x75,0x76, 0x77,0x78, 0x79,0x7A, 0x7B,0x7C, 0x83,0x84, 0x8D,0x8E, 0x91,0x92,
		0x95,0x96, 0x99,0x9A, 0x9D,0x9E, 0xA6,0xA7,
};

u8 SH8501A_otptime=0;
void SH8501A_Write_Register(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
  
        if(SigMode != CMD_Mode)
            SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
        delay_ms(5);
        SSD2828_W_Array(SigMode,channel,buffer,2);
        delay_ms(50);
        SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
 
    buffer[4] = Uart_Error_None;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //·µ»Ø Ð´¼Ä´æÆ÷×´Ì¬  £ºok  
}
void SH8501A_Read_Register(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	
        if(SigMode == Video_Mode)  //RGB+SPI= MIPI
            SSD2828_W_Reg(SigMode,channel,0xB7,((HS_B7_Data|0x0010)&0XFFFD)|0x0080);      
        else
            SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080);
        delay_ms(5);
        SSD2828_W_Reg(SigMode,channel,0xC1,0x0002); 
        SSD2828_W_Reg(SigMode,channel,0xC0,0x0001); 
        SSD2828_W_Reg(SigMode,channel,0xBC,0x0001);
        SSD2828_W_Reg(SigMode,channel,0xBD,0x0000);                                    
        for(i=0;i<3;i++)
        {
            SSD2828_W_Cmd(SigMode,channel,0xBF);
            SSD2828_W_Data(SigMode,channel,buffer[3]+i);
            if(SigMode == Video_Mode)  //RGB+SPI= MIPI   
                SSD2828_W_Reg(SigMode,channel,0xD4,0x00FA);  
            delay_ms(25);
            buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF);
        }                              
        SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
        delay_ms(5);
        STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //·µ»Ø ¶ÁÈ¡µÄ ¼Ä´æÆ÷Êý¾Ý  £ºok  	
    
}
void SH8501A_Write_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void SH8501A_Read_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void SH8501A_Gamma_OTP_Start(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 SH8501A_otptime);
void SH8501A_auto_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);

//----------------------------------------------SH8501A----------------------------------------------
void SH8501A_Write_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{

				u8 buffer1[5];
				delay_ms(5);
				if(buffer[4]==0x01)
				{
						buffer1[0] = 0x01;
						buffer1[1] = 0xC5;
						//buffer1[2] = 0x50;                // GAMMA1  page
					  OSPI_Write_u8_Array(0,channel,buffer1,0); 
				}
				else if(buffer[4]==0x02)
				{  
						buffer1[0] = 0x01;
						buffer1[1] = 0xC6;
						//buffer1[2] = 0x60;                // GAMMA2  page
					  OSPI_Write_u8_Array(0,channel,buffer1,0); 
				}   
				else 
				{
						buffer1[0] = 0x01;
						buffer1[1] = 0xC7;
						//buffer1[2] = 0x30;                // GAMMA3  page
					  OSPI_Write_u8_Array(0,channel,buffer1,0); 
				}
				/*if((buffer[3]&0x10) == 0x10) //27??
				{
						buffer1[0] = 0x02;	
						buffer1[1] = 0xAB;
						buffer1[2] = 0x01;  
					OSPI_Write_u8_Array(0,channel,buffer1,0); 	
				}
				else
				{
						buffer1[0] = 0x02; //13??
						buffer1[1] = 0xAB;
						buffer1[2] = 0x81;  
            OSPI_Write_u8_Array(0,channel,buffer1,0); 							
				}	*/
          		
				
				for( i = 0;i<buffer[2]-1;i++) 
				{	 
					
							if((buffer[3]&0x10) == 0x10)
								{
								 if((buffer[3]&0x0f)==0x01) 
									 buffer1[1]=SH8501A_Gamma_r[i];
								 else if((buffer[3]&0x0f)==0x02) 
												 buffer1[1]=SH8501A_Gamma_g[i];	 
								 else if((buffer[3]&0x0f)==0x03) 
									  buffer1[1]=SH8501A_Gamma_b[i];
							  }
							else
								{
								 if((buffer[3]&0x0f)==0x01) 
									 buffer1[1]=SH8501A_Gamma_r1[i];
								 else if((buffer[3]&0x0f)==0x02) 
									 buffer1[1]=SH8501A_Gamma_g1[i];
								 else if((buffer[3]&0x0f)==0x03)
									 buffer1[1]=SH8501A_Gamma_b1[i];
							  }  
							  buffer1[2]=buffer[5+i];
							  OSPI_Write_u8_Array(0,channel,buffer1,0); 	
				}
				buffer[4] = Uart_Error_None;
		STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?Gamma??  :ok  
}

void SH8501A_Read_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
		    u8 buffer1[5];
	        u8 buffer2[1];
				buffer1[0] = 0x02;
				if(buffer[4]==0x01)
				{
						buffer1[1] = 0xC5;
						//buffer1[2] = 0x50;                // GAMMA1  page
					  OSPI_Write_u8_Array(0,channel,buffer1,0); 
				}
				else if(buffer[4]==0x02)
				{  
						buffer1[1] = 0xC6;
						//buffer1[2] = 0x60;                // GAMMA2  page
					  OSPI_Write_u8_Array(0,channel,buffer1,0); 
				}   
				else 
				{
						buffer1[1] = 0xC7;
						//buffer1[2] = 0x30;                // GAMMA3  page
					  OSPI_Write_u8_Array(0,channel,buffer1,0); 
				}
				/*if((buffer[3]&0x10) == 0x10) //27??
				{
						buffer1[0] = 0x02;	
						buffer1[1] = 0xAB;
						buffer1[2] = 0x01;  
				}
				else
				{
						buffer1[0] = 0x02; //13??
						buffer1[1] = 0xAB;
						buffer1[2] = 0x81;  		
				}
        OSPI_Write_u8_Array(0,channel,buffer1,0); 				
				delay_ms(15);*/
				
				for( i = 0;i<buffer[2]-1;i++)			 	
				{  	
                            
						buffer1[0] = 0x02;
						
						if((buffer[3]&0x10) == 0x10)
						 {
							buffer1[1] = ((buffer[3]&0x0f)==0x01) ? SH8501A_Gamma_r[i] : (((buffer[3]&0x0f)==0x02) ? SH8501A_Gamma_g[i] : SH8501A_Gamma_b[i]);
						 }
						else 
						{
							buffer1[1] = ((buffer[3]&0x0f)==0x01) ? SH8501A_Gamma_r1[i] : (((buffer[3]&0x0f)==0x02) ? SH8501A_Gamma_g1[i] : SH8501A_Gamma_b1[i]);
						}
						
						OSPI_Read_Array_Data(0, channel,buffer1[1] ,buffer2,1);
						buffer[5+i]=buffer2[0];
						delay_ms(6);      
				}	
				delay_ms(5);

    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ??? Gamma??  :ok  
}



void SH8501A_Gamma_OTP_Start(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 SH8501A_otptime)
{
	if((SigMode !=SPI4_Mode)&&(SigMode !=SPI3_Mode))
	{
				u8 buffer1[3];  
				SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);  
				delay_ms(5);
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0x00;
				SSD2828_W_Array(SigMode,channel,buffer1,0);     // UCS????
				delay_ms(5);
				buffer1[0] = 0x02;
				buffer1[1] = 0x28;
				buffer1[2] = 0x00;
				SSD2828_W_Array(SigMode,channel,buffer1,0);     // ??? 
				delay_ms(100);  //otp
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0x01; 
				SSD2828_W_Array(SigMode,channel,buffer1,0);     //Page0
				buffer1[0] = 0x02;
			
			
				if(buffer[3] == 0x00)				//OTP page 10 20 40 70 90 
				{
						buffer1[1] = 0xF0;///0xF6
						buffer1[2] = 0xA6;////0x08	    			
						SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
					
						buffer1[1] = 0xF6;///0xF6
						buffer1[2] = 0x4C;////0x08	    			
						SSD2828_W_Array(SigMode,channel,buffer1,0);     //  
				}
				else if(buffer[3] == 0x10)		//otp page10
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x04;
						SSD2828_W_Array(SigMode,channel,buffer1,0);
				}
				else if(buffer[3] == 0x20)	//otp page20
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x08;
						SSD2828_W_Array(SigMode,channel,buffer1,0);			
				}
				else if(buffer[3] == 0x30)	//otp page30
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x10;
						SSD2828_W_Array(SigMode,channel,buffer1,0);		
				}
				else if(buffer[3] == 0x40)	//otp page40
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0xA0;
						SSD2828_W_Array(SigMode,channel,buffer1,0);			
				}
				else if(buffer[3] == 0x50)	//otp page50
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x10;
						SSD2828_W_Array(SigMode,channel,buffer1,0);				
				}
				else if(buffer[3] == 0x60)	//otp page60
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x08;
						SSD2828_W_Array(SigMode,channel,buffer1,0);			
				}
				else if(buffer[3] == 0x70)	//otp page70
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x04;
						SSD2828_W_Array(SigMode,channel,buffer1,0);	
				}
				else if(buffer[3] == 0x90)	//otp page90
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x40;
						SSD2828_W_Array(SigMode,channel,buffer1,0);		
				}

				buffer1[0] = 0x02;//MTPCTR
				buffer1[1] = 0xF2;
				buffer1[2] = 0x03;
				SSD2828_W_Array(SigMode,channel,buffer1,0);    
			
				buffer1[0] = 0x02;
				buffer1[1] = 0xF3;
				buffer1[2] = 0xA5;
				SSD2828_W_Array(SigMode,channel,buffer1,0);  

				buffer1[0] = 0x02;
				buffer1[1] = 0xF4;
				buffer1[2] = 0x5A;
				SSD2828_W_Array(SigMode,channel,buffer1,0);  

				buffer1[0] = 0x02;
				buffer1[1] = 0xF5;
				buffer1[2] = 0x3C;
				SSD2828_W_Array(SigMode,channel,buffer1,0);  			
	}
	else
	{
	    	u8 buffer1[3];  
				buffer1[0] = 0x02;
				buffer1[1] = 0xFE;
				buffer1[2] = 0x00;
		    GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				delay_ms(5);
				buffer1[1] = 0x28;
				buffer1[2] = 0x00;
	    	GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				delay_ms(100);  //otp
				buffer1[1] = 0xFE;
				buffer1[2] = 0x01; 
		    GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
			
			
				if(buffer[3] == 0x00)				//OTP page 10 20 40 70 90 
				{
						buffer1[1] = 0xF0;///0xF6
						buffer1[2] = 0xA6;////0x08	    			
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
					
						buffer1[1] = 0xF6;///0xF6
						buffer1[2] = 0x4C;////0x08	    			
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x10)		//otp page10
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x04;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x20)	//otp page20
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x08;	
            GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 					
				}
				else if(buffer[3] == 0x30)	//otp page30
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x10;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x40)	//otp page40
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0xA0;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x50)	//otp page50
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x10;		
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x60)	//otp page60
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x08;
            GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 					
				}
				else if(buffer[3] == 0x70)	//otp page70
				{
						buffer1[1] = 0xF0;
						buffer1[2] = 0x04;
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}
				else if(buffer[3] == 0x90)	//otp page90
				{
						buffer1[1] = 0xF6;
						buffer1[2] = 0x40;	
					  GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
				}

				buffer1[0] = 0x02;//MTPCTR
				buffer1[1] = 0xF2;
				buffer1[2] = 0x03;
        GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 				
			
				buffer1[1] = 0xF3;
				buffer1[2] = 0xA5;
        GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 				

				buffer1[1] = 0xF4;
				buffer1[2] = 0x5A;
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 

				buffer1[1] = 0xF5;
				buffer1[2] = 0x3C;
				GenW_PANEL_normal_SPI_Write_code(SigMode,channel,buffer1); 
		
	}
    		
                      
    delay_ms(1500);         // wait for >400 ms   
    buffer[4] = Uart_Error_Oth;
    STM2PC(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?OTP??  :ok
}
void SH8501A_auto_Gamma(USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{

							u8 buffer1[3];
							delay_ms(5);	
				     /* buffer1[0] = 0x02;
							buffer1[1] = 0xFE;
							buffer1[2] = 0x50;              // GAMMA1  page1
	            OSPI_Write_u8_Array(0,channel,buffer1,0); 
	            buffer1[0] = 0x02;
							buffer1[1] = 0xAB;
							buffer1[2] = 0x01; */             // AB,01 27points
	            //OSPI_Write_u8_Array(0,channel,buffer1,0);
						switch(buffer[15])
						{
							case 0:
							{
							buffer1[0] = 0x01;
							buffer1[1] = 0xC5;
							//buffer1[2] = 0x50;              // GAMMA1  page1
							OSPI_Write_u8_Array(0,channel,buffer1,0); 
							}
							  break;
							case 1:
							{
							buffer1[0] = 0x01;
							buffer1[1] = 0xc6;
							//buffer1[2] = 0x60;              // GAMMA1  page1
							OSPI_Write_u8_Array(0,channel,buffer1,0); 
							}
							  break;
						case 2:
							{
							buffer1[0] = 0x01;
							buffer1[1] = 0xC7;
							//buffer1[2] = 0x30;              // GAMMA1  page1
							OSPI_Write_u8_Array(0,channel,buffer1,0); 
							}
							break;
						
						}
	
				for( i =1;i<(buffer[2]+1)/2;i++) 
				{	 					
				buffer1[1]=buffer[2*i+1];
				buffer1[2]=buffer[2*i+2];
				OSPI_Write_u8_Array(0,channel,buffer1,0);
				}							
			
}


void ProcessForIc82( USBD_HandleTypeDef *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8 buffer[],u16 LP_B7_Data,u16 HS_B7_Data)//ADD BY PCS
{
switch(buffer[1]&0xFF)
		{
        case 0x01:                                      //????
				SH8501A_Write_Register(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
				case 0x02:                                      //????
				SH8501A_Read_Register(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
				break;
				case 0x03:                                      //?Gamma
        SH8501A_Write_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
        break;
        case 0x04:                                      //?Gamma
        SH8501A_Read_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
        break;
				case 0x05:
        SH8501A_Gamma_OTP_Start(pdev,ep_addr,SigMode ,channel,buffer, LP_B7_Data,HS_B7_Data,SH8501A_otptime);//???
				break;
				case 0x06:           // auto Gamma
        SH8501A_auto_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
        break;
				default:break;
	}	
}
